﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Transactions;

namespace BLL
{
	public class QLTBLoiThietBi
	{
        /// <summary>
        /// Lấy tất cả lỗi thiết bị
        /// </summary>
        public static IEnumerable<ThongBaoLoiThietBi> GetAll()
        {
            return Generic.GetAll<ThongBaoLoiThietBi>();
        }

        /// <summary>
        /// Thêm lỗi thiết bị
        /// </summary>
        public static ActionResult Insert(ThongBaoLoiThietBi tbltb)
        {
            ActionResult ac = new ActionResult();
            if (tbltb.LoaiTB == "")
            {
                ac.Exceptions.Add(new Exception("chưa nhập loại thiết bị "));
            }
            if (tbltb.MaTB == "")
            {
                ac.Exceptions.Add(new Exception("chưa nhập mã thiết bị "));
            }
            if (tbltb.MaNguoiGui == "")
            {
                ac.Exceptions.Add(new Exception("chưa nhập mã người gửi thiết bị "));
            }
            if (QLTBLoiThietBi.FindByMaTB(tbltb.MaTB) != null)
            {
                ac.Exceptions.Add(new Exception("thiết bị này có lỗi rồi,vui lòng cập nhật lỗi thiết bị này"));
            }
            if (tbltb.NoiDungLoi == "")
            {
                ac.Exceptions.Add(new Exception("chưa nhập nội dung lỗi "));
            }
            try
            {
                if (ac.Success)
                {
                    Generic.Insert<ThongBaoLoiThietBi>(tbltb);
                }
            }
            catch (Exception ex)
            {
                ac.Exceptions.Add(ex);
            }
            return ac;
        }
        public static ActionResult Insert(ThongBaoLoiThietBi tbltb, KQBaoTriTB kqbttb)
        {
            ActionResult kq = new ActionResult("gửi lỗi thiết bị");
            using (var transaction = new TransactionScope())
            {
                kq.Exceptions.AddRange(Insert(tbltb).Exceptions);
                if (kq.Success)
                {
                    kq.Exceptions.AddRange(QLKQBaoTriTB.Insert(kqbttb).Exceptions);
                }
                if (kq.Success)
                {
                    ThietBi tb = QLThietBi.FindByID(tbltb.MaTB);
                    tb.TinhTrang = "Tạm sử dụng";
                    QLThietBi.Update(tb);
                    transaction.Complete();
                }
                else
                {
                    transaction.Dispose();
                    Generic.Reconnect();
                }
            }
            return kq;
        }
        public static ActionResult Insert(ThongBaoLoiThietBi tbltb, KQBaoTriTB kqbttb, List<ThongBaoLoiMayTinh> dstblmt)
        {
            ActionResult kq = new ActionResult("gửi lỗi máy tính");
            using (var transaction = new TransactionScope())
            {

                kq.Exceptions.AddRange(Insert(tbltb, kqbttb).Exceptions);
                if (kq.Success)
                {
                    dstblmt.ForEach(x =>
                    {
                        x.MaLoiTB = tbltb.MaLoiTB;
                        kq.Exceptions.AddRange(QLThongBaoLoiMayTinh.Insert(x).Exceptions);
                    });
                }
                if (kq.Success)
                {
                    ThietBi tb = QLThietBi.FindByID(tbltb.MaTB);
                    tb.TinhTrang = "Tạm sử dụng";
                    QLThietBi.Update(tb);
                    transaction.Complete();
                }
                else
                {
                    transaction.Dispose();
                    Generic.Reconnect();
                }
            }
            return kq;
        }
        /// <summary>
        /// Xóa lỗi thiết bị
        /// </summary>
        public static int Delete(ThongBaoLoiThietBi ltb)
        {
            return Generic.DeleteByCondition<ThongBaoLoiThietBi>(ltb1 => ltb1.MaLoiTB == ltb.MaLoiTB);
        }

        /// <summary>
        /// Xóa lỗi thiết bị theo thuộc tính
        /// </summary>
        public static bool DeleteByID(int maltb)
        {
            return Generic.DeleteByCondition<ThongBaoLoiThietBi>(x => x.MaLoiTB == maltb) > 0;
        }

        public static bool DeleteByMaTB(string matb)
        {
            return Generic.DeleteByCondition<ThongBaoLoiThietBi>(x => x.MaTB == matb) > 0;
        }

        /// <summary>
        /// Xóa tất cả lỗi thiết bị
        /// </summary>
        public static int DeleteAll(IEnumerable<ThongBaoLoiThietBi> ps)
        {
            return Generic.DeleteByCondition<ThongBaoLoiThietBi>(ltb => ps.Where(x => x.MaLoiTB == ltb.MaLoiTB).Count() == 1);
        }

        /// <summary>
        /// Cập nhật lỗi thiết bị
        /// </summary>
        public static int Update(ThongBaoLoiThietBi ltb)
        {
            return Generic.EditByCondition<ThongBaoLoiThietBi>(k => k.MaLoiTB == ltb.MaLoiTB, k =>
            {
                k.MaLoiTB = ltb.MaLoiTB;
                k.MaNguoiGui = ltb.MaNguoiGui;
                k.MaTB = ltb.MaTB;
                k.GhiChu = ltb.GhiChu;
                k.NgayGui = ltb.NgayGui;
                k.NoiDungLoi = ltb.NoiDungLoi;

            });
        }

        /// <summary>
        /// Tìm lỗi thiết bị theo điều kiện
        /// </summary>
        public static IEnumerable<ThongBaoLoiThietBi> FindByCondition(Func<ThongBaoLoiThietBi, bool> func)
        {
            return Generic.FindByCondition<ThongBaoLoiThietBi>(func);
        }

        /// <summary>
        /// Tìm lỗi thiết bị theo thuộc tính
        /// </summary>
        ///
        // public static 
        public static ThongBaoLoiThietBi FindByID(int maloi)
        {
            return Generic.FindOneByCondition<ThongBaoLoiThietBi>(x => x.MaLoiTB == maloi);
        }
        public static ThongBaoLoiThietBi FindByMaTB(string matb)
        {
            return Generic.FindOneByCondition<ThongBaoLoiThietBi>(x => x.MaTB == matb);
        }
        public enum DKTimKiem
        {
            MaLoiTB = 0,
            MaNguoiGui,
            MaTB,
            LoaiTB,
            NoiDungLoi,
            NgayGui,
            GhiChu,
        };

		public static void TimKiem(DKTimKiem dk, DataGridView drv, string dktk)
		{
			try
			{
				switch (dk)
				{
					case DKTimKiem.MaLoiTB:
						drv.DataSource = FindByCondition(x => Regex.IsMatch(x.MaLoiTB.ToString().ToLower(), dktk.ToLower()));
						break;
					case DKTimKiem.MaNguoiGui:
						drv.DataSource = FindByCondition(x => Regex.IsMatch(x.MaNguoiGui.ToString().ToLower(), dktk.ToLower()));
						break;
					case DKTimKiem.MaTB:
						drv.DataSource = FindByCondition(x => Regex.IsMatch(x.MaTB.ToString().ToLower(), dktk.ToLower()));
						break;
					case DKTimKiem.LoaiTB:
						drv.DataSource = FindByCondition(x => Regex.IsMatch(x.LoaiTB.ToString().ToLower(), dktk.ToLower()));
						break;
					case DKTimKiem.NoiDungLoi:
						drv.DataSource = FindByCondition(x => Regex.IsMatch(x.NoiDungLoi.ToString().ToLower(), dktk.ToLower()));
						break;
					case DKTimKiem.NgayGui:
						drv.DataSource = FindByCondition(x => x.NgayGui!= null && Regex.IsMatch(x.NgayGui.Value.ToShortDateString(), dktk));
						break;
					case DKTimKiem.GhiChu:
						drv.DataSource = FindByCondition(x => Regex.IsMatch(x.GhiChu.ToString().ToLower(), dktk.ToLower()));
						break;
					default:
						break;
				}
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
			}
		}
	}
}
